// 函数柯里化 函数反柯里化

// 判断变量的 类型
/**
 * 常见的判断数据的方法有四种
 * 1. typeof 不能判断对象类型  typeof [] typeof {}
 * 2. constructor 可以找到这个变量是 通过谁 构造出来的
 * 3. instanceof 判断谁是谁的实例 __proto__
 * 4. Object.prototype.toString.call() 缺陷是不能细分是谁是谁的实例
 */

function isType(type, value) {
    return Object.prototype.toString.call(value) === `[object ${type}]`
}

// isType([], 'Array')
// 能不能 将方法进行细分 isType => isString isArray
// console.log(isType([], 'Array'))


// function isType(type) {
//     return function(value) {
//         return Object.prototype.toString.call(value) === `[object ${type}]`
//     }
// }

// let isArray = isType([], 'Array')

// isArray('hello')
// isArray([])


//通过一个柯里化函数 实现通用的柯里化方法
const currying = (fn, arr) => {
    let len = fn.length  // 这里获取的是函数的参数的个数
    return function (...args) {
        arr = [...arr, ...args]
        if(arr.length < len) {
            return currying(fn, arr) //递归 不停的 产生函数
        } else {
            return fn(...arr)
        }
    }
}
let isArray = currying(isType)('Array')
let isString = currying(isType)('String')

console.log(isArray('123')) 
console.log(isArray([])) 

function sum(a, b, c, d, e, f) {
    return a + b + c + d + e + f
} 
let r = currying(sum)(1, 2)(3, 4)(5)(6)










